/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.DeclaracoesIniciais;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Declaracoes.RegraDeclaracaoStruct;
import analiseSintatica.Regras.Declaracoes.RegraDeclaracaoVar;
import analiseSintatica.Regras.Blocos.*;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Dede do Bem
 * 
 * <declaracao> ::= <declaracao_var> | <declaracao_struct>
 */
public class RegraDeclaracao extends Regra{

    protected static Regra instancia;

    protected String estrutura = "<declaracao_var> | <declaracao_struct>";
    
    


    /**
     * Construtor privado necessario ao singleton
     */
    private RegraDeclaracao() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraDeclaracao getInstance() {
        if (instancia == null) {
            instancia = new RegraDeclaracao();
        }
        return (RegraDeclaracao) instancia;
    }


    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {

        ErroSintaticoException erros = new ErroSintaticoException();
               
        NoArvore NaoTerminalDeclaracao = new NoArvore("<declaracao>", false);
        
        try{
            
            if(RegraDeclaracaoVar.getInstance().getPrimeiro().contains(listaTokens.getFirst().getLexema())){
                NaoTerminalDeclaracao.adicionaFilho(RegraDeclaracaoVar.getInstance().analisar(listaTokens));
            }
            else{
                NaoTerminalDeclaracao.adicionaFilho(RegraDeclaracaoStruct.getInstance().analisar(listaTokens));
            }
        }
        catch(ErroSintaticoException e){
            
        }
System.out.println("Terminei Regra Declaracao");
        return NaoTerminalDeclaracao;
    }


    @Override
    protected void setPrimeiro() {
        this.primeiro.add("char");
        this.primeiro.add("int");
        this.primeiro.add("float");
        this.primeiro.add("boolean");
        this.primeiro.add("identificador");
//        this.primeiro = getUniao(this.primeiro, RegraDeclaracaoVar.getInstance().getPrimeiro());
//        this.primeiro = getUniao(this.primeiro, RegraDeclaracaoStruct.getInstance().getPrimeiro());

    }

    @Override
    protected void setSeguinte() {
        this.seguinte.add("void");
        this.seguinte.add("typedef");
        this.seguinte.add("const");
        this.seguinte.add("identificador");
        this.seguinte.add("char");
        this.seguinte.add("int");
        this.seguinte.add("float");
        this.seguinte.add("boolean");
        this.seguinte.add("}");
        this.seguinte.add("if");
        this.seguinte.add("while");
        this.seguinte.add("do");
        this.seguinte.add("return");
        this.seguinte.add("for");
        this.seguinte.add("printf");
        this.seguinte.add("scanf");
        this.seguinte.add("*");
        this.seguinte.add("++");
        this.seguinte.add("--");
        this.seguinte.add("else");
        //QUE NEGOCIO CHATO DA PEEEEESTE!
        
//        this.seguinte = getUniao(this.seguinte, RegraDeclsInicial.getInstance().getSeguinte());
//
//        if (!listaContem(seguinte, new LinkToken("delimitador", "}", 0))){
//            this.seguinte.add("}");
//        }


    }

}
